/*
 * Copyright 2008 Jeff Dwyer
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.apress.progwt.client.widget.datepicker;

import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.HasHorizontalAlignment.HorizontalAlignmentConstant;

/**
 * Picker that includes a LongRangePicker for easier picking of dates in
 * the past.
 * 
 * @author Jeff Dwyer
 * 
 */
public class HDatePicker extends SimpleDatePicker implements
        DatePickerInterface {

    private static final int WIDTH = 530;

    private LongRangePicker longRangePicker;
    private HorizontalAlignmentConstant align;

    public HDatePicker(HorizontalAlignmentConstant constant) {
        super();
        this.align = constant;
    }

    protected void init() {
        this.setWidth(80 + "px");
        this.setStyleName("txtbox");
        addClickListener(this);
        addKeyboardListener(this);

        longRangePicker = new LongRangePicker(this);
    }

    protected void addCalendar(DatePicker datePicker) {
        vertPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
        vertPanel.add(calendarTraversalPanel);
        vertPanel.add(calendarPanel);
        vertPanel.add(todayPanel);
        vertPanel.add(longRangePicker);
        // calendarPopup.addStyleName("date_DisplayPanel");
        vertPanel.setStyleName("date_DisplayPanel");
        calendarPopup.add(vertPanel);
    }

    // @Override
    public void redrawCalendar() {
        // Log.debug("H Date Picker redraw "+getSelectedDate());
        this.calendarPanel.redrawCalendar();
        this.calendarTraversalPanel.drawTitle();
        longRangePicker.redraw(getCurrentDate());
    }

    // @Override
    protected void showCalendar() {
        calendarPopup.show();
        if (align == HorizontalPanel.ALIGN_RIGHT) {

            // getAbsoluteLeft() is broken in FF for things in our
            // gadgetDisplayer
            // seems to be a known problem, but no good fix. Even FireBug
            // says that the
            // left position is 450px, which is totally wrong.
            //
            // found native method below on forum, but it returns the same
            // thing
            //
            // int left = this.getAbsoluteLeft() - WIDTH;
            int left = Window.getClientWidth() - WIDTH;

            // make sure it doesn't go too low
            int top = this.getAbsoluteTop() + this.getOffsetHeight() + 4;
            top = (Window.getClientHeight() - top > 400) ? top : Window
                    .getClientHeight() - 400;

            calendarPopup.setPopupPosition(left, top);
            Log
                    .debug("SHOW RIGHT "
                            + (this.getAbsoluteLeft() - WIDTH)
                            + " "
                            + (this.getAbsoluteTop()
                                    + this.getOffsetHeight() + 4));

            // Logger.log("SHOW RIGHT "+getAbsoluteLeft(getElement())+"
            // FIX "+getAbsoluteLeftFix(getElement()));

            calendarPopup.setHeight(120 + "px");
            calendarPopup.setWidth(165 + "px");
            calendarPopup.setStyleName("date_popupPanel");
        } else {
            calendarPopup.setPopupPosition(this.getAbsoluteLeft(), this
                    .getAbsoluteTop()
                    + this.getOffsetHeight() + 4);
            calendarPopup.setHeight(120 + "px");
            calendarPopup.setWidth(165 + "px");
            calendarPopup.setStyleName("date_popupPanel");
        }
    }

    // public native int getAbsoluteLeft(Element elem) /*-{
    // var left = 0;
    // while (elem) {
    // left += elem.offsetLeft - elem.scrollLeft;
    // elem = elem.offsetParent;
    // }
    // return left + $doc.body.scrollLeft;
    // }-*/;
    // public native int getAbsoluteLeftFix(Element elem) /*-{
    // var left = 0, parent;
    // while (elem) {
    // left += elem.offsetLeft - elem.scrollLeft;
    // parent =
    // @com.google.gwt.user.client.DOM::getParent(Lcom/google/gwt/user/client/Element;)(elem);
    // elem = elem.offsetParent;
    // while (parent != elem) {
    // left -= parent.scrollLeft;
    // parent =
    // @com.google.gwt.user.client.DOM::getParent(Lcom/google/gwt/user/client/Element;)(parent);
    // }
    // }
    // return left + $doc.body.scrollLeft;
    // }-*/;

    public Widget getWidget() {
        return this;
    }
}
